package com.ssm.changeunit.command;

import com.ssm.changeunit.*;
import com.ssm.changeunit.persistance.DatabaseManager;
import com.ssm.changeunit.persistance.PersistanceException;
import com.ssm.changeunit.persistance.BranchDAO;
import com.ssm.changeunit.persistance.BranchDTO;
import com.ssm.changeunit.persistance.ChangeUnitBranchDAO;
import com.ssm.changeunit.persistance.ChangeUnitBranchDTO;
import org.apache.log4j.Logger;
import java.util.List;
import com.ssm.changeunit.Environment;
import java.io.IOException;

/**
 * Type 옵션 : add, list, delete
 * 
 * Add나 Delete일 경우에는 Name 옵션이 추가로 붙어야함.
 * 
 * ex) ChangeUnitConsole branch -type add -name NewBranch
 * ex) ChangeUnitConsole branch -type delete -name NewBranch
 * ex) ChangeUnitConsole branch -type list
 * 
 * @author 시리우스
 */
public class BranchCommandWorker extends CommandWorker {
    
    private Logger log = Logger.getLogger(BranchCommandWorker.class);

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.D5B71702-4744-F0C5-F330-946291AEC3DE]
    // </editor-fold> 
    public BranchCommandWorker () {
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.0C306CDB-A07F-B4A7-5EAE-48AB35FD9AF1]
    // </editor-fold> 
    public void work (CommandWorkerOptions commandWorkerOptions) throws CommandWorkerException {
        if( commandWorkerOptions == null )
            throw new CommandWorkerException("Option이 null입니다.");
        
        if( !commandWorkerOptions.hasCommandWorkerOption("type") )
            throw new CommandWorkerException("Type Option이 존재하지 않습니다.");
        
        // type option을 꺼내옵니다.
        CommandWorkerOption itemCommandWorkerOption = commandWorkerOptions.getCommandWorkerOption("type");
        
        // Item option에 해당하는 item들을 가져옵니다.
        String[] types = itemCommandWorkerOption.getValues();
        
        // type의 값이 없는 경우
        if( types.length == 0 )
            throw new CommandWorkerException("Type의 값이 존재하지 않습니다.");
        
        // type의 값이 1개 이상 들어온 경우
        if( types.length > 1 )
            throw new CommandWorkerException("Type의 값이 다수로 입력되었습니다.");
        
        //type 변수에 -type 의 parameter 값을 저장합니다.
        String type=types[0];
        log.debug("type : "+type+"\n");
        
        // 데이터베이스 체크
        log.debug("데이터베이스가 존재하는지 검사합니다.");
        
        try {
            if(!DatabaseManager.getInstance().isExists())
                throw new CommandWorkerException("데이터베이스가 존재하지 않습니다.");
        }
        catch(PersistanceException ex) {
            throw new CommandWorkerException(ex);
        }
        
        BranchDAO branchDAO = new BranchDAO();
        
        if(type.equals("list")){
            
            //branch 이름 전부 가져오기
            try{
                List<BranchDTO> branchList = branchDAO.list();
                
                for(BranchDTO item : branchList) {
                    
                    String message = item.getBranchName();
                
                    if(item.getBranchName().equals(Environment.getCurrentBranch())){
                        message+="*";
                    }
                    log.info(message);
                }
            }
            catch(IOException ex) {
                throw new CommandWorkerException(ex);
            }
            catch(PersistanceException ex){
                throw new CommandWorkerException(ex);
            }
        }
 
        
        if(type.equals("add")||type.equals("delete")){
            
            //type 변수가 add 이거나 delete 일 경우에는 -name 의 parameter 값을 가져 옵니다. : add delete 의 공통 작업
            if( !commandWorkerOptions.hasCommandWorkerOption("name") )
                throw new CommandWorkerException("Name Option이 존재하지 않습니다.");

            // type option을 꺼내옵니다.
            CommandWorkerOption itemCommandWorkerOption2 = commandWorkerOptions.getCommandWorkerOption("name");

            // Item option에 해당하는 item들을 가져옵니다.
            String[] types2 = itemCommandWorkerOption2.getValues();

            // type의 값이 없는 경우
            if( types2.length == 0 )
                throw new CommandWorkerException("Name의 값이 존재하지 않습니다.");

            // type의 값이 1개 이상 들어온 경우
            if( types2.length > 1 )
                throw new CommandWorkerException("Name의 값이 다수로 입력되었습니다.");

            String name =types2[0];
            log.debug("name : "+name+"\n");
        
            //add 인 경우의 처리 작업
            if(type.equals("add")){

                // Branch 정보를 저장합니다.
                Branch addingBranch = null;
                Branch currentBranch = null;
                try {
                    addingBranch = new BranchFactory().createProduct(name);
                    currentBranch = new BranchFactory().createProduct(Environment.getCurrentBranch());
                }
                catch(IOException ex) {
                    throw new CommandWorkerException(ex);
                }
                catch(CreateException ex) {
                    throw new CommandWorkerException("Branch를 가져오는 도중 에러가 발생했습니다.", ex);
                }
                
                try{
                    //TO_DO 현재 changeUnit value 가져와서 추가되는 branch setting
                    addingBranch.setCurrentChangeUnit(currentBranch.getCurrentChangeUnit());
                    addingBranch.setOriginChangeUnit(currentBranch.getCurrentChangeUnit());

                    //기존 branch 정보를 가지고 ChangeUnit 을 받아온다.
                    ChangeUnitBranchDAO changeUnitBranchDAO = new ChangeUnitBranchDAO();
                    List<ChangeUnitBranchDTO>  changeUnitBranch= changeUnitBranchDAO.findByBranchName(Environment.getCurrentBranch());

                    //가져온 기존의 changeUnit 을 기반으로 새로 저장되는 branch 를 저장한다.
                    for(ChangeUnitBranchDTO item : changeUnitBranch) {
                        item.setBranchName(name);
                        changeUnitBranchDAO.insert(item);
                    }
                }
                catch(IOException ex) {
                    throw new CommandWorkerException(ex);
                }
                catch(PersistanceException ex){
                    throw new CommandWorkerException(ex);
                }
            }
               
            //delete 인 경우의 처리 작업
            if(type.equals("delete")){
                try{
                    ChangeUnitBranchDAO changeUnitBranchDAO = new ChangeUnitBranchDAO();
                    
                    changeUnitBranchDAO.deleteByBranchName(name);
                    
                    /*
                    List<ChangeUnitBranchDTO> changeUnitBranch= changeUnitBranchDAO.findByBranchName(name);

                    //가져온 기존의 changeUnit 을 기반으로  branch 를 삭제한다.
                    for(ChangeUnitBranchDTO item : changeUnitBranch) {
                        changeUnitBranchDAO.delete(item.getChangeUnitId());
                    }*/
                    
                    /*
                    Branch deleteBranch = new BranchFactory().createProduct(name);
                    
                    ChangeUnitBranchDAO changeUnitBranchDAO = new ChangeUnitBranchDAO();
                    
                    List<ChangeUnitBranchDTO> changeUnitBranch = changeUnitBranchDAO.findByBranchName(name);
                    
                    for(ChangeUnitBranchDTO item : changeUnitBranch) {
                        ChangeUnit changeUnit = new ChangeUnitFactory().createProduct(item.getChangeUnitId());
                    
                        changeUnit.removeBranch(deleteBranch);
                    }*/
                    
                    //Branch 테이블에서 삭제
                    BranchDAO branch = new BranchDAO();
                    branch.delete(name);
                }
                catch(PersistanceException ex){
                    throw new CommandWorkerException(ex);
                }

            }
        }
        
        
    }

}

